package Contacts;

import java.io.*;
import java.util.ArrayList;
import java.util.Comparator;

/**
 * Description:
 * 通讯录管理类:
 * 1.使用ArrayList类存储联系人对象，以及对联系人对象列表的增删改查功能
 * 2.实现联系人对象从本地读取并存入
 *
 * 未实现的功能：
 * 1.不能处理同名联系人的情况。
 *
 * Author:Jiali
 * Date:2022-08-23 13:37
 */

public class ContactsController {
    //联系人对象集合
    private ArrayList<Person> contacts = new ArrayList<>();

    public ContactsController() {
        loadData();
    }

    /**
     * 从本地文件加载联系人数据
     */
    private void loadData(){
        ObjectInputStream in = null;
        try {
            in = new ObjectInputStream(new FileInputStream("contacts.dat"));
            Object obj = null; //存储临时读取的对象

            while((obj = in.readObject()) != null){ //读取文件中的所有对象
                contacts.add((Person)obj); //添加到集合对象中
            }
            System.out.println("CurrentSize:" + contacts.size());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 保存联系人信息到本地
     */
    public void saveData(){
        ObjectOutputStream out = null;
        try {
            out = new ObjectOutputStream(new FileOutputStream("contacts.dat"));

            for (int i = 0; i < contacts.size(); i++) {
                out.writeObject(contacts.get(i));
            }
            out.writeObject(null); //最后写一个null进去代表文件末尾
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

    /**
     * @return  true if this list contains no elements
     */
    public boolean isEmpty(){
        return contacts.isEmpty();
    }

    /**
     * 按姓名查询联系人对象
     * @param name
     * @return 查询到了就返回指定对象的下标，否则返回-1
     */
    public int queryByName(String name){
        for (int i = 0; i < contacts.size(); i++) {
            if(contacts.get(i).getName().equalsIgnoreCase(name)){
                return i; //found
            }
        }
        return -1; //not found
    }


    /**
     * 添加联系人
     * @param person 联系人对象
     * @return true:添加成功    false:添加失败
     */
    public boolean insert(Person person){
       return contacts.add(person);
    }

    /**
     * 删除指定姓名联系人
     * @param name 要删除的联系人姓名
     * @return true:删除成功    false:删除失败
     */
    public boolean remove(String name){
        int index = 0;
        if ((index = queryByName(name)) != -1){
            contacts.remove(index);
            return true;
        }else{
            return false;
        }
    }

    /**
     * 修改指定索引联系人
     * @param index 要修改的指定元素下标
     * @param person 修改为的联系人对象
     * @return true:修改成功    false:修改失败
     */
    public void modify(int index,Person person){
        contacts.set(index,person);
    }

    /**
     *查找指定索引联系人
     * @param index
     * @return 指定索引的联系人对象
     */
    public Person queryOne(int index){
        return contacts.get(index);
    }

    /**
     * 返回联系人对象数组
     * @return
     */
    public Person[] queryAll(){
        if (contacts.size() == 0)
            return null;
        return contacts.toArray(new Person[contacts.size()]);
    }

    /**
     * 按姓名排序联系人列表
     */
    public void sortByName(){
        contacts.sort(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });
    }

    /**
     * 清空联系人列表
     */
    public void clearAll(){
        contacts.clear();
    }
}
